package com.ruoyi.pos.domain.goods;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.DecimalMin;
import java.math.BigDecimal;

/**
 * POS商品信息实体类
 * 
 * 用于管理POS系统中的商品信息，从第三方系统获取商品数据
 * 支持不同柜组的商品配置和快速查询
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosGoods extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 商品ID（主键）
     */
    private Long goodsId;

    /**
     * 柜组ID
     * 
     * 商品属于哪个柜组
     */
    @Excel(name = "柜组ID")
    @NotNull(message = "柜组ID不能为空")
    private Long groupId;

    /**
     * 商品编码
     * 
     * 关联第三方商品系统的商品编码
     */
    @Excel(name = "商品编码")
    @NotBlank(message = "商品编码不能为空")
    @Size(max = 50, message = "商品编码长度不能超过50个字符")
    private String goodsCode;

    /**
     * 商品名称
     * 
     * 从第三方系统获取的商品名称
     */
    @Excel(name = "商品名称")
    @NotBlank(message = "商品名称不能为空")
    @Size(max = 200, message = "商品名称长度不能超过200个字符")
    private String goodsName;

    /**
     * 商品条码
     * 
     * 商品的条形码，用于扫码识别
     */
    @Excel(name = "商品条码")
    @Size(max = 50, message = "商品条码长度不能超过50个字符")
    private String barcode;

    /**
     * 商品规格
     * 
     * 商品的规格信息，如容量、重量等
     */
    @Excel(name = "商品规格")
    @Size(max = 100, message = "商品规格长度不能超过100个字符")
    private String specification;

    /**
     * 商品单价
     * 
     * 从第三方系统获取的商品单价
     */
    @Excel(name = "商品单价")
    @NotNull(message = "商品单价不能为空")
    @DecimalMin(value = "0.0", inclusive = false, message = "商品单价必须大于0")
    private BigDecimal unitPrice;

    /**
     * 商品单位
     * 
     * 商品的计量单位，如瓶、包、个等
     */
    @Excel(name = "商品单位")
    @Size(max = 20, message = "商品单位长度不能超过20个字符")
    private String unit;

    /**
     * 商品图片URL
     * 
     * 商品图片的访问地址
     */
    @Excel(name = "商品图片")
    @Size(max = 500, message = "商品图片URL长度不能超过500个字符")
    private String imageUrl;

    /**
     * 商品分类编码
     * 
     * 商品所属分类的编码
     */
    @Excel(name = "分类编码")
    @Size(max = 50, message = "分类编码长度不能超过50个字符")
    private String categoryCode;

    /**
     * 商品分类名称
     * 
     * 商品所属分类的名称
     */
    @Excel(name = "分类名称")
    @Size(max = 100, message = "分类名称长度不能超过100个字符")
    private String categoryName;

    /**
     * 商品品牌编码
     * 
     * 商品所属品牌的编码
     */
    @Excel(name = "品牌编码")
    @Size(max = 50, message = "品牌编码长度不能超过50个字符")
    private String brandCode;

    /**
     * 商品品牌名称
     * 
     * 商品所属品牌的名称
     */
    @Excel(name = "品牌名称")
    @Size(max = 100, message = "品牌名称长度不能超过100个字符")
    private String brandName;

    /**
     * 是否可改价
     * 
     * 0-不可改价（自营商品）
     * 1-可改价（非自营商品）
     */
    @Excel(name = "是否可改价", readConverterExp = "0=不可改价,1=可改价")
    private String canChangePrice;

    /**
     * 商品状态
     * 
     * 0-正常
     * 1-停用
     */
    @Excel(name = "商品状态", readConverterExp = "0=正常,1=停用")
    private String status;

    /**
     * 排序序号
     * 
     * 在快捷商品列表中的显示顺序
     */
    @Excel(name = "排序序号")
    private Integer sortOrder;

    /**
     * 备注
     * 
     * 商品的备注信息
     */
    @Excel(name = "备注")
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    // ==================== 扩展字段（非数据库字段） ====================

    /**
     * 柜组名称（非数据库字段）
     */
    @Excel(name = "柜组名称")
    private String groupName;

    /**
     * 库存数量（非数据库字段，从第三方系统获取）
     */
    @Excel(name = "库存数量")
    private Integer stockQuantity;

    /**
     * 最后同步时间（非数据库字段）
     */
    @Excel(name = "最后同步时间")
    private String lastSyncTime;

    // ==================== 业务方法 ====================

    /**
     * 判断商品是否可改价
     */
    public boolean isChangePriceAllowed() {
        return "1".equals(canChangePrice);
    }

    /**
     * 判断商品状态是否正常
     */
    public boolean isNormal() {
        return "0".equals(status);
    }

    /**
     * 判断商品是否有库存
     */
    public boolean hasStock() {
        return stockQuantity != null && stockQuantity > 0;
    }

    /**
     * 获取商品显示名称
     * 
     * 格式：商品名称 + 规格（如果有）
     */
    public String getDisplayName() {
        if (specification != null && !specification.trim().isEmpty()) {
            return goodsName + " " + specification;
        }
        return goodsName;
    }

    /**
     * 获取商品完整信息
     * 
     * 格式：商品名称 + 规格 + 单位（如果有）
     */
    public String getFullInfo() {
        StringBuilder info = new StringBuilder(goodsName);
        
        if (specification != null && !specification.trim().isEmpty()) {
            info.append(" ").append(specification);
        }
        
        if (unit != null && !unit.trim().isEmpty()) {
            info.append(" ").append(unit);
        }
        
        return info.toString();
    }

    /**
     * 设置商品为可改价
     */
    public void setChangePriceAllowed() {
        this.canChangePrice = "1";
    }

    /**
     * 设置商品为不可改价
     */
    public void setChangePriceNotAllowed() {
        this.canChangePrice = "0";
    }

    /**
     * 设置商品状态为正常
     */
    public void setNormal() {
        this.status = "0";
    }

    /**
     * 设置商品状态为停用
     */
    public void setDisabled() {
        this.status = "1";
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}
